<?php

namespace App\Services\Conversion;

class BinaryString
{
<<<<<<< HEAD
    //十六进制转二进制转字符串
=======
<<<<<<< HEAD
    //十六进制转二进制转字符串
=======
<<<<<<< HEAD
    //十六进制转二进制字符串
=======
    //十六进制转二进制转字符串
>>>>>>> ad3f2ce75fb6a6518d685720d3e13e7eb6b3b462
>>>>>>> 5b8878cf77da32ab9fb02103e80d26f0a43187e4
>>>>>>> 75818497ef9bb23fd6bd1547c9e88686d864b7ad
    static function getSign($bitmap_str)
    {
        // 对数据流使用网络字节序（大端）解包拿到16进制数据的字符串形式
        $hex_str = unpack("H*", $bitmap_str)[1];
        // hex str 的长度
        $hex_str_len = strlen($hex_str);
        // 为了防止 hex to dec 时发生溢出
        // 我们需要切分 hex str，使得每一份 hex str to dec 时都能落在 int 类型的范围内
        // 因为 2 位 16 进制表示一个字节，所以用系统 int 类型的字节长度去分组是绝对安全的
        $chunk_size = PHP_INT_SIZE;
        // 对 hex str 做分组对齐，否则 str 的最后几位可能会被当作低位数据处理
        // 比如 fffff 以 4 位拆分 'ffff', 'f' 后 最后一组 'f' 就被低位数据处理了
        // 对齐后 fffff000 分组 'ffff', 'f000' 就能保证 'f' 的数据位了
        $hex_str = str_pad($hex_str, $hex_str_len + ($chunk_size - ($hex_str_len % $chunk_size)), 0, STR_PAD_RIGHT);
        // 防止 hexdec 时溢出 使用 PHP_INT_SIZE 个 16 进制字符一组做拆分
        // 因 16 进制 2 位标识一个字节 所以 PHP_INT_SIZE 是绝对不会溢出的
        $hex_str_arr = str_split($hex_str, $chunk_size);
        // 位数据的二进制字符串
        $bitmap_bin_str = '';
        array_walk($hex_str_arr, function($hex_str_chunk) use (&$bitmap_bin_str, $chunk_size) {
            $bitmap_bin_str .= str_pad(decbin(hexdec($hex_str_chunk)), $chunk_size * 4, 0, STR_PAD_LEFT);
        });
        return $bitmap_bin_str;
    }
}